package com.java;

/**
 * 线程安全问题：多线程模拟三个窗口共同卖10张票的场景
 */
public class ThreadSafety {
    static class ThreadSon extends Thread {
        // static修饰是因为票的数量应该被所有窗口共享
        static int ticket = 0;
        
        @Override
        public void run() {
            while (true) {
                if (ticket > 9) {
                    break;
                }
                
                try {
                    Thread.sleep(1000); // 模拟窗口出票延时
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                ticket++;
                System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票");
            }
        }
    }
    
    public static void main(String[] args) throws InterruptedException {
        new ThreadSon().start();
        new ThreadSon().start();
        new ThreadSon().start();
    }
    
    /**
     * 输出结果如下，每次运行的结果不同！多线程卖票可能出现重复卖或卖超的问题
     * Thread-1正在卖第3张票
     * Thread-2正在卖第3张票
     * Thread-0正在卖第3张票
     * Thread-2正在卖第5张票
     * Thread-0正在卖第6张票
     * Thread-1正在卖第5张票
     * Thread-2正在卖第7张票
     * Thread-0正在卖第9张票
     * Thread-1正在卖第9张票
     * Thread-1正在卖第12张票
     * Thread-0正在卖第12张票
     * Thread-2正在卖第12张票
     */
}
